//package nbcp.base.utils
//
//
//import nbcp.base.comm.config
//import nbcp.base.extend.AsString
//import nbcp.base.extend.HasValue
//import nbcp.base.extend.ToJson
//import nbcp.base.model.HttpRequestModel
//import nbcp.base.model.HttpResponseModel
//import nbcp.base.utils.FileUtil.resolvePath
//import okhttp3.*
//import okhttp3.FormBody.Builder.*
//import okhttp3.MediaType.Companion.toMediaType
//import okhttp3.OkHttpClient.Builder.*
//import okhttp3.RequestBody.Companion.asRequestBody
//import okhttp3.RequestBody.Companion.toRequestBody
//import org.slf4j.LoggerFactory
//import java.io.File
//import java.util.concurrent.TimeUnit
//import java.util.stream.Collectors
//
//
//class OkHttpUtil {
//    var name: String = ""
//
//    /**
//     * 执行请求
//     *
//     * @param requestModel
//     * @return Response
//     */
//    fun doInvoke(requestModel: HttpRequestModel): HttpResponseModel {
//        if (requestModel.name.HasValue) {
//            this.name = requestModel.name
//        }
//        val headers = Headers.Builder()
//
//        for ((key, value) in requestModel.requestHeader) {
//            headers.add(key, value)
//        }
//
//
//        val url = requestModel.withQueryUrl
//
//
//        val request = Request.Builder()
//
//        try {
//            request.url(url)
//        } catch (e: Exception) {
//            throw RuntimeException("url 设置异常,url: " + url + " " + e.message)
//        }
//
//        request.headers(headers.build())
//
//
//        if ("GET".equals(requestModel.requestMethod, ignoreCase = true)) {
//            request.get()
//        } else {
//            var postContent = requestModel.postString
//            val postObject = requestModel.postObject
//            if (postContent == null && postObject != null) {
//                postContent = postObject.ToJson()
//            }
//
//            var requestBody: RequestBody? = null
//            if (postContent != null) {
//                requestBody = postContent!!.toRequestBody(
//                    "application/json".toMediaType()
//                )
//            } else {
//                val postBytes = requestModel.postBytes
//                if (postBytes != null) {
//                    val bodyBuilder = MultipartBody.Builder()
//                    bodyBuilder.setType(MultipartBody.FORM)
//
//                    val uploadFileName = requestModel.uploadFileName
//                    var file: File? = null
//
//                    file = if (uploadFileName.HasValue) {
//                        File(
//                            resolvePath(
//                                System.getProperty("java.io.tmpdir"),
//                                "http-util-" + CodeUtil.getCode(),
//                                uploadFileName!!
//                            )
//                        )
//                    } else {
//                        File(
//                            resolvePath(
//                                System.getProperty("java.io.tmpdir"),
//                                "http-util-" + CodeUtil.getCode()
//                            )
//                        )
//                    }
//
//                    file.writeBytes(postBytes)
//
//                    bodyBuilder.addFormDataPart(
//                        "file",
//                        uploadFileName.AsString("file"),
//                        file!!.asRequestBody("application/octet-stream".toMediaType())
//                    )
//
//                    requestBody = bodyBuilder.build()
//                }
//            }
//
//
//            if (requestBody == null) {
//                requestBody = FormBody.Builder().build()
//            }
//
//            val method = requestModel.requestMethod
//            if ("POST".equals(method, ignoreCase = true)) {
//                request.post(requestBody)
//            } else if ("PUT".equals(method, ignoreCase = true)) {
//                request.put(requestBody)
//            } else if ("DELETE".equals(method, ignoreCase = true)) {
//                request.delete(requestBody)
//            }
//        }
//
//
//        //https://www.cnblogs.com/greyzeng/p/14148675.html
//        val client = OkHttpClient.Builder()
//            .connectionPool(CONNECTION_POOL)
//            .connectTimeout(
//                config.getConfig("app.http-client.pool.connectTimeoutSeconds", 30L),
//                TimeUnit.SECONDS
//            )
//            .readTimeout(
//                config.getConfig("app.http-client.pool.readTimeoutSeconds", 180L),
//                TimeUnit.SECONDS
//            )
//            .build()
//
//
//        val responseModel = HttpResponseModel()
//        val result = client.newCall(request.build()).execute()
//
//        val resHeaders = result.headers
//        for (item in resHeaders) {
//            responseModel.addHeader(item.component1(), item.component2())
//        }
//
//        if (contentTypeIsTextType(result.header("content-type"))) {
//            responseModel.responseBody = result.body!!.string()
//        }
//        responseModel.status = result.code
//
//        logInfo(requestModel, responseModel)
//
//        return responseModel
//    }
//
//    private fun logInfo(requestModel: HttpRequestModel, responseModel: HttpResponseModel) {
//        val responseHeader = responseModel.responseHeader
//        val responseBody = responseModel.responseBody
//        val method = requestModel.requestMethod
//        val url = requestModel.withQueryUrl
//        val status = responseModel.status
//
//        if (responseBody == null) {
//            logErrorWithResponse(requestModel, responseModel)
//            return
//        }
//
//        if (status >= 400) {
//            logErrorWithResponse(requestModel, responseModel)
//            return
//        }
//
//
//        var logBody = responseBody
//        if (logBody.length > 1024) {
//            logBody = logBody.substring(0, 1024) + " ..."
//        }
//
//
//        log.info("[{}] {} {} ◈{} ◈{} ◈{}",
//            status,
//            method,
//            url,
//            requestModel.requestHeader.keys
//                .stream()
//                .map<String> { it: String -> it + ": " + requestModel.requestHeader[it] }
//                .collect(Collectors.joining(" , ")),
//            logBody,
//            responseHeader.keys
//                .map { it.toString() + ": " + responseHeader.get(it) }
//                .joinToString(" , ")
//        )
//    }
//
//    private fun logErrorWithResponse(requestModel: HttpRequestModel, responseModel: HttpResponseModel) {
//        val responseHeader = responseModel.responseHeader
//        val responseBody = responseModel.responseBody
//        val method = requestModel.requestMethod
//        val url = requestModel.withQueryUrl
//        val status = responseModel.status
//
//        var logBody = responseBody.AsString()
//        if (logBody.length > 1024) {
//            logBody = logBody.substring(0, 1024) + " ..."
//        }
//
//
//        log.error("[{}] {} {} ◈{} ◈{} ◈{}",
//            status,
//            method,
//            url,
//            requestModel.requestHeader.keys
//                .stream()
//                .map { it: String -> it + ": " + requestModel.requestHeader[it] }
//                .collect(Collectors.joining(" , ")),
//            logBody,
//            responseHeader.keys
//                .map { it.toString() + ": " + responseHeader.get(it) }
//                .joinToString(" , ")
//        )
//    }
//
//    companion object {
//        val CONNECTION_POOL: ConnectionPool = ConnectionPool(256, 180L, TimeUnit.SECONDS)
//
//        /**
//         * 判断是否是文本类型
//         *
//         * @param contentType
//         * @return
//         */
//        fun contentTypeIsTextType(contentType: String?): Boolean {
//            if (contentType == null) {
//                return false
//            }
//            if (contentType.contains("json")) {
//                return true
//            } else if (contentType.contains("text") || contentType.contains("plain")) {
//                return true
//            } else if (contentType.contains("html") || contentType.contains("xml")) {
//                return true
//            }
//            return false
//        }
//
//
//        private val log = LoggerFactory.getLogger(OkHttpUtil::class.java)
//    }
//}
